<?php

if (!function_exists('encrypt')) {
    /**
     * 加密算法（可逆）
     * @param $data string 待加密的字符串
     * @param $key string 秘钥
     * @return string
     */
    function encrypt($data, $key)
    {
        // 例：$data = 'zhongyuhuile'; $key = 'aabbcc';
        $key = md5($key); // 加密秘钥 等于32位字符串
        $x = 0;
        $len = strlen($data); // 获取字符串的长度  $data长度等于12
        $l = strlen($key); // 获取秘钥长度  $key长度等于32
        $char = ''; // 重组秘钥
        $str = ''; // 加密后的字符串

        // 重组秘钥
        for ($i = 0; $i < $len; $i++) {  // $i < 12
            if ($x == $l) { // 如果自增参数 等于 秘钥长度 32位时 ，初始化 $x = 0 ; 例子中字符串长度等于12 小于 32位秘钥长度
                $x = 0;
            }
            // 重组秘钥 拼接秘钥的第 $x 位。如果字符串长度大于秘钥长度，例如字符串是64位的，重组的秘钥就等于是 $key . $key。
            // 如果字符串小于加密秘钥 例如$data长度等于12。重组的秘钥 就等于 $key的前 12位
            $char .= $key{$x};
            $x++;
        }
        // chr() 函数从指定的 ASCII 值返回字符。ord() 函数返回字符串的首个字符的 ASCII 值。
        for ($i = 0; $i < $len; $i++) {
            $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
        }
        // 返回base64加密的加密字符串
        return base64_encode($str);
    }
}

if (!function_exists('decrypt')) {
    /**
     * 解密算法
     * @param $data string 被加密的字符串
     * @param $key string 秘钥
     * @return string
     */
    function decrypt($data, $key)
    {
        $key = md5($key);
        $x = 0;
        $data = base64_decode($data);
        $len = strlen($data);
        $l = strlen($key);
        $char = '';
        $str = '';
        for ($i = 0; $i < $len; $i++) {
            if ($x == $l) {
                $x = 0;
            }
            $char .= substr($key, $x, 1);
            $x++;
        }
        for ($i = 0; $i < $len; $i++) {
            if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
                $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
            } else {
                $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
            }
        }
        return $str;
    }
}